package net.intellect.force;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.sforce.soap.enterprise.ID;
import com.sforce.soap.enterprise.sobject.SObject;

public class UtilBasic {
	
	
	/**
	 * Convierte una string en ID de salesforce
	 * @param idString
	 * @return
	 */
	public static ID obtenerId(String idString) {
		try {
			ID idSF = new ID();
			idSF.setID(idString);
			return idSF;
		} catch (Exception e) {
			return null;
		}
	}	
	
	
	/**
	 * Devuelve true si es domingo
	 * @param fecha1
	 * @return
	 */
	public static boolean esDomingo(Date fecha1) {
		Calendar calendario = Calendar.getInstance();
		calendario.setTimeInMillis(fecha1.getTime());
		if (calendario.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
			return true;
		}
		return false;
	}
	
	/**
	 * Devuelve true si es sabado
	 * @param fecha1
	 * @return
	 */
	public static boolean esSabado(Date fecha1) {
		Calendar calendario = Calendar.getInstance();
		calendario.setTimeInMillis(fecha1.getTime());
		if (calendario.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
			return true;
		}
		return false;
	}			
	
	
	public static String obtenerFechaSF(Date fecha){
		SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd'T00:00:00Z'");
		return formato.format(fecha);
	}

	public static String obtenerFechaSinHorasSF(Date fecha){
		SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
		return formato.format(fecha);
	}	
	

	
	public static String obtenerLlaves(Set<String> llaves){
		String resultado = new String();
		for (Iterator<String> iter = llaves.iterator();iter.hasNext();) {
			resultado = resultado + " '" + iter.next() + "'" ;
			if (iter.hasNext()) resultado+=",";
		}
		
		return "(" + resultado + ")";		
	}	

	
	public static Date parsearStringDate(String fecha) throws Exception {
		SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy");
        return f.parse(fecha);			
	}
	
	public static String parsearDateString(Date fecha) throws Exception {
		SimpleDateFormat f = new SimpleDateFormat("dd-MM-yyyy");		
        return f.format(fecha);			
	}
	
	public static String parsearDateTimeString(Date fecha) throws Exception {
		SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy HH:mm");		
        return f.format(fecha);			
	}	
	
	public static String formatearFechaNormal(Date fecha) throws Exception {
		if (fecha==null) return "NULL";
		SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy");		
        return f.format(fecha);			
	}	
	
	public static String formatearFechaHoraNormal(Date fecha) throws Exception {
		if (fecha==null) return "NULL";
		SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");		
        return f.format(fecha);			
	}	
	
	
	
	
	
	/*
	 * Obtiene un submapa 
	 */
	public static Map<String,Integer> obtenerSubMapa(Map<String,Integer> mapa,int fromIndex,int toIndex){
		Map<String,Integer> mapaSub = new HashMap<String,Integer>();
					
		String[] ids = mapa.keySet().toArray(new String[mapa.size()]);
					
		for (int i=0;i<toIndex-fromIndex;i++) {
			mapaSub.put(ids[fromIndex+i], 0);
			
		}						
		return mapaSub;
	}			
	
	/*
	 * Obtiene las llaves de un Map para un consulta sql
	 */
	public static String obtenerLlaves(Map<String,Integer> mapa){
		String resultado = new String();
		Set<String> ids = mapa.keySet();
		for (Iterator<String> iter = ids.iterator();iter.hasNext();) {
			resultado = resultado + " '" + iter.next() + "'" ;
			if (iter.hasNext()) resultado+=",";
		}
		
		return "(" + resultado + ")";		
	}

	/*
	 * Obtiene las llaves de un Map para un consulta sql
	 */
	public static String obtenerLlavesDouble(Map<String,Integer> mapa){
		String resultado = new String();
		Set<String> ids = mapa.keySet();
		for (Iterator<String> iter = ids.iterator();iter.hasNext();) {
			resultado = resultado  + iter.next() ;
			if (iter.hasNext()) resultado+=",";
		}
		
		return "(" + resultado + ")";		
	}
	
	
	public static List<SObject> convertirSObject(List<? extends SObject> lista) {
		List<SObject> objects = new ArrayList<SObject>();
		try {
			if (lista!=null) {
				for (int i=0;i<lista.size();i++) {
					objects.add(lista.get(i));
				}
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return objects;		
	}
	

	
	
	public static SObject[] convertirArraySObject(List<? extends SObject> lista) {
		if (lista==null) return null;
		
		SObject[] objects = new SObject[lista.size()];
		try {
			for (int i=0;i<lista.size();i++) {
				objects[i] = lista.get(i);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return objects;		
	}	
	
	public static Map<String,Integer> obtenerMapaBasico(Set<String> ids){
		Map<String,Integer> newMap = new HashMap<String,Integer>();
		for (Iterator<String> iter = ids.iterator();iter.hasNext();) {
			String key = iter.next();
			newMap.put(key, 0);
		}		
		return newMap;
	}
	
	public static String obtenerDateSalesforce(Date fecha){
		SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
		return formato.format(fecha);		
	}	
	
	public static String obtenerDateTimeSalesforce(Date fecha){
		SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd'T00:00:00Z'");
		return formato.format(fecha);		
	}	
	
	
	public static Date sumasDiasFecha(Date fecha1,int numDias) {
		Calendar calendario = Calendar.getInstance();
		calendario.setTimeInMillis(fecha1.getTime());
		calendario.add(Calendar.DATE, numDias);		
		return calendario.getTime();
	}	
	

}
